from typing import Any, List

import sys, os

import kenlm

# 应用根目录
# 下层的库需要依赖它，所以先设置
app_path = os.path.dirname(__file__)

# 让这个包内内容可以被找到
sys.path.append("..") 

import config

from future_fields import FutureField, FutureFields
future_fields = FutureFields()

from analyse import Analyse
from api.server import Server
from api.task import TaskManager

class App:
    def run(self, argv:List[str]) -> None:
        if "test" in argv:
            self.run_test()
        elif "run" in argv:
            self.run_app()
        else:
            self.run_app()

    def run_app(self) -> None:
        # 所有对象
        analyse = Analyse()
        FutureField("analyse").set(analyse)
        server = Server()
        task_manager = TaskManager("api")
        # 配置
        configs = [analyse, server, task_manager]
        config = self.init_config(configs)
        if not self.do_config(configs, config):
            print("初始化配置文件，请修改配置文件后重新启动程序。")
            return
        # 运行服务器
        server.run(task_manager)

    def run_test(self) -> None:
        analyse = Analyse()
        server = Server()
        configs = [analyse, server]
        config = self.init_config(configs)
        if not self.do_config(configs, config):
            print("初始化配置文件，请修改配置文件后重新启动程序。")
            return
        
        print(analyse.get("是故内圣外王之道，暗而不明，郁而不发，天下之人各为其所欲焉以自为方。"))

    def init_config(self, modules:list) -> config.Config:
        c = config.Config()
        for module in modules:
            module.init(c)
        return c
    
    def do_config(self, modules:list, c: config.Config) -> config.Config:
        if not c.read(): return False
        for module in modules:
            module.config(c.data)
        return True

if __name__ == "__main__":
    App().run(sys.argv[1:])